#include "../compat/queue.h"
#include <sys/time.h>
#include "util.h"

#ifndef __EVENT_STRUCT_H
#define __EVENT_STRUCT_H
// 事件标志
#define EVLIST_TIMEOUT 0x01 // 事件处理器从属于通用定时器队列或时间堆
#define EVLIST_INSERTED 0x02 // 事件处理器从属于注册事件队列 
#define EVLIST_SIGNAL 0x04   // 没有使用
#define EVLIST_ACTIVE 0x08 // 事件处理器从属于活动事件队列
#define EVLIST_INTERNAL 0x10  // 内部使用
#define EVLIST_INIT 0x80            // 事件已经被初始化
#define EVLIST_ALL (0xf000|0x9f)    // 所有标志

struct event_base;
struct event
{
    // 注册事件队列
    TAILQ_ENTRY(event) ev_next;
    // 激活事件队列
    TAILQ_ENTRY(event) ev_active_next;

    //用于定时事件处理器
    union {
        TAILQ_ENTRY(event) ev_next_with_common_timeout;
        // 在最小堆中的index
        int min_heap_idx;
    } ev_timeout_pos;
    // 用于io事件处理器和信号事件处理器
    struct
    {
        TAILQ_ENTRY(event) ev_io_next;
        struct timeval ev_timeout;
    } ev_io;
    union {
        struct {
            TAILQ_ENTRY(event) ev_io_next;
            struct timeval ev_timeout;
        }ev_io;
        struct
        {
            TAILQ_ENTRY(event) ev_signal_next;
            short ev_ncalls;
            short *ev_pncalls;
        }ev_signal;
    }_ev ;
    
    // 从属的event_base实例
    struct event_base* ev_base;
    // 如果是信号事件就是信号 io事件就是fd
    evutil_socket_t ev_fd;

    // 事件类型
    short ev_events;
    // 当前激活事件的类型
    short ev_res;
    // 事件标志
    short ev_flags;
    // 事件的优先级
    ev_uint8_t ev_pri;
    // 指定事件处理器回调函数时的行为
    ev_uint8_t ev_closure;
    // 超时时间
    struct timeval ev_timeout;

    // 回调函数及其参数
    void (*ev_callback)(evutil_socket_t,short,void *arg);
    void *ev_arg;

};
#endif